//---------------------------------------------------------------------------

#ifndef NoeudReseauGraphiqueH
#define NoeudReseauGraphiqueH
//---------------------------------------------------------------------------
class LiaisonReseauGraphique;
class ReseauGraphique;

#define NOM_CLASSE_NNODAL TStaticText
#define NOM_CLASSE_NASSOC TStaticText

class NoeudReseauGraphique {
public:
  enum ETypeNoeud {ETN_Concept_Nodal=0, ETN_Concept_Relationnel, ETN_Association, ETN_Virtuel};
  __fastcall NoeudReseauGraphique(int x, int y, const AnsiString &nom, ETypeNoeud typeNoeud, ReseauGraphique * reseau);

  void __fastcall ResetForce(void);
  void __fastcall DeplacerObjetAssocieAsTControl(bool nomRelationsInvisibles);
  void __fastcall AppliquerRepulsion(NoeudReseauGraphique * n, double distanceTheorique, double coefRepulsion);
  void __fastcall AnnulerRecouvrement(NoeudReseauGraphique * n);
  void __fastcall AppliquerAttraction(NoeudReseauGraphique * n, double distanceTheorique);
  void __fastcall AppliquerRepulsionBordures(double distanceTheorique, double coefRepulsion, double minX, double minY, double maxX, double maxY);
  void __fastcall RecentrerSurLabel(void);
  void __fastcall SetRectEnglobant(const TRect & rectEnglobant);
  void __fastcall RestaurerTailleGonflage(TList * liste);

  double __fastcall AppliquerForces(double coefVitesse, double vitesseMax);
  double __fastcall CalcDist2To(NoeudReseauGraphique * n);
  bool __fastcall Intersecte(NoeudReseauGraphique * n);
  virtual __fastcall ~NoeudReseauGraphique();
  bool __fastcall PeutAppartenirAuGroupe(TList * gp);
  bool __fastcall EstRelieA(NoeudReseauGraphique * n);
  void __fastcall AddLiaison(LiaisonReseauGraphique * liaison);
  void __fastcall RemoveLiaison(LiaisonReseauGraphique * liaison);
  LiaisonReseauGraphique * __fastcall LiaisonDepuis(NoeudReseauGraphique * n);
  LiaisonReseauGraphique * __fastcall LiaisonVers(NoeudReseauGraphique * n);
  void __fastcall PropagerVisibilite(LiaisonReseauGraphique * from, bool respecterLeSensDesLiaisons, bool voirConceptsRelationels, int puissanceMin, bool voirReciproques);
  void __fastcall PropagerOuverture(int distanceMax, bool respecterLeSensDesLiaisons, bool dontReset, bool voirReciproques);
  void __fastcall RecupererNoeudsProches(LiaisonReseauGraphique * from, int distanceMax, bool respecterLeSensDesLiaisons, TList * listeNoeuds);
  void __fastcall PropagerSignalFloodFill(bool respecterLeSensDesLiaisons, bool voirReciproques, TList * noeuds);
  void __fastcall DecacherVoisinage(void);
  void __fastcall CenterOn(int relX, int relY);
  void __fastcall CalcRectangleEnglobant(void);
  void __fastcall CheckNom(void);
  bool __fastcall APourEntrees(TList * entrees);
  void __fastcall AddNoeudsInTo(TList * liste);
  void DeterminerRectangleReseau(TRect & r);
  void __fastcall UpdateCouleur(const AnsiString & surlignage, TControl * controleActif);
  void __fastcall UpdateCouleurProximite(void);
  TControl * __fastcall DetruireObjetAssocie(void);
  void __fastcall CheckNoeudRelationel(NoeudReseauGraphique * relationTheorique);
  void __fastcall CacherAssociationSiReciproque(NoeudReseauGraphique * ass, NoeudReseauGraphique * from);
  void __fastcall RefreshHint(void);
  void __fastcall LoadSujetsIn(TList * sujets);
  bool __fastcall EstAssocReciproqueDe(NoeudReseauGraphique * n);
  bool __fastcall EstAssocPrincipale(void);
  bool __fastcall APourSortie(NoeudReseauGraphique * n);
  bool __fastcall EstSujetDeRelationReciproqueDe(NoeudReseauGraphique * nAss);
  void __fastcall PreciseNomParParent(void);
  void __fastcall CheckRelationPrincipale(void);
  void __fastcall InitialiserPositionDe(NoeudReseauGraphique * dest);
  bool __fastcall IsRacine(void);
  void __fastcall AppliquerAttractionOrdonneeDest(double distanceTheorique);
  void __fastcall AugmenterRangDe(NoeudReseauGraphique * n);
  void __fastcall RelationPrincipaleIndeterminee(void);
  void __fastcall CentrageEtZoom(double xCentreR, double yCentreR, double xCentreV, double yCentreV, double zoomX, double zoomY);
  double __fastcall CalcDeplacement(void);
  void __fastcall SaveCurPos(void);

  __property double X  = { read=FX, write=SetX };
  __property double Y  = { read=FY, write=SetY };
  __property double Rayon  = { read=FRayon, write=SetRayon };
  __property void * ObjetAssocie  = { read=FObjetAssocie, write=FObjetAssocie };
  __property AnsiString Nom  = { read=FNom, write=SetNom };
  __property bool Visible  = { read=FVisible, write=SetVisible };
  __property bool Cache  = { read=FCache, write=SetCache };
  __property ETypeNoeud TypeNoeud  = { read=FTypeNoeud, write=SetTypeNoeud };
  __property bool Ouvert  = { read=FOuvert, write=SetOuvert };
  __property TList * NoeudsLies  = { read=FNoeudsLies };
  __property TList * LiaisonsIn  = { read=FLiaisonsIn };
  __property TList * LiaisonsOut  = { read=FLiaisonsOut };
  __property int Puissance  = { read=GetPuissance };
  __property NoeudReseauGraphique * LastAssociation  = { read=GetLastAssociation };
  __property ReseauGraphique * Reseau  = { read=FReseau, write=SetReseau };
  __property AnsiString IDSauvegarde  = { read=GetIDSauvegarde };
  __property AnsiString NomComplet  = { read=GetNomComplet };
  __property bool IsLien  = { read=GetIsLien };
  __property AnsiString NomAffiche  = { read=GetNomAffiche };
  __property NoeudReseauGraphique * RelationReciproque  = { read=FRelationReciproque, write=SetRelationReciproque };
  __property NoeudReseauGraphique * ConceptRelation  = { read=GetConceptRelation };
  __property AnsiString NomFormule  = { read=GetNomFormule };
  __property bool IsUtile  = { read=GetIsUtile };
  __property double ForcesAppliquees2  = { read=GetForcesAppliquees2 };
  __property bool RelationPrincipale  = { read=FRelationPrincipale, write=SetRelationPrincipale };
  __property bool Ouvrable  = { read=GetOuvrable };

private:

  static int FCurPropagation;
  double FX;
  double FY;
  double FLastX;
  double FLastY;
  double FdXCSG;
  double FdYCSG;
  double FRayon;
  double FForceX;
  double FForceY;
  TRect FRect;
  void * FObjetAssocie;
  AnsiString FNom;
  AnsiString FNomAffiche;
  bool FVisible;
  bool FCache;
  ETypeNoeud FTypeNoeud;
  bool FOuvert;
  TList * FNoeudsLies;
  TList * FActivations;
  TList * FLiaisonsIn;
  TList * FLiaisonsOut;
  ReseauGraphique * FReseau;
  int FLastPropagation;
  NoeudReseauGraphique * FRelationReciproque;
  bool FRelationPrincipale;

  void __fastcall SetX(double value);
  double __fastcall GetX();
  void __fastcall SetY(double value);
  double __fastcall GetY();
  void __fastcall SetRayon(double value);
  double __fastcall GetRayon();
  void __fastcall AjouterForceVers(NoeudReseauGraphique * n, double norme, double unite);
  void __fastcall RecurseTranslation(int dx, int dy, TList * liste, TList * dejaTraite);
  void __fastcall SetNom(AnsiString value);
  void __fastcall SetVisible(bool value);
  void __fastcall SetDistance(int value);
  void __fastcall SetCache(bool value);
  void __fastcall SetTypeNoeud(ETypeNoeud value);
  void __fastcall SetOuvert(bool value);
  void __fastcall CheckValiditeNoeudLie(NoeudReseauGraphique * n);
  int __fastcall GetPuissance();
  NoeudReseauGraphique * __fastcall GetLastAssociation();
  void __fastcall SetReseau(ReseauGraphique * value);
  AnsiString __fastcall GetIDSauvegarde();
  AnsiString __fastcall GetNomComplet();
  bool __fastcall GetIsLien();
  AnsiString __fastcall GetNomAffiche();
  void __fastcall SetRelationReciproque(NoeudReseauGraphique * value);
  NoeudReseauGraphique * __fastcall GetConceptRelation();
  AnsiString __fastcall GetNomFormule();
  bool __fastcall GetIsUtile();
  double __fastcall GetForcesAppliquees2();
  bool __fastcall EstActivePar(NoeudReseauGraphique * n, bool respecterLeSensDesLiaisons, bool voirReciproques);
  void __fastcall SetRelationPrincipale(bool value);
  bool __fastcall GetOuvrable();
};

#endif
